/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
export var numSubarrayProductLessThanK = function (nums, k) {
  if (k <= 1) return 0

  //双指针，表示当前遍历的区间[left, right]，闭区间
  let [left, right] = [0, 0]
  //创建一个变量记录路上的乘积
  let product = 1
  //定义变量动态保存最大 求和/计数
  let ans = 0

  //右指针遍历到数组尾
  while (right < nums.length) {
    //增加当前右指针对应的数值
    product *= nums[right]
    //当在该区间内 sum 超出定义范围
    while (product >= k) {
      //先将左指针指向的数值减去
      product /= nums[left]
      //左指针右移
      left++
    }
    //每次右指针位移到一个新位置，应该加上 x 种数组组合：
    //  nums[right]
    //  nums[right-1], nums[right]
    //  nums[right-2], nums[right-1], nums[right]
    //  nums[left], ......, nums[right-2], nums[right-1], nums[right]
    //共有 right - left + 1 种
    ans += right - left + 1

    //移动右指针，去探索下一个区间
    right++
  }
  return ans
}
